package com.xiyuan.smartutils.constants;

import java.util.HashMap;

/**
 * HTTP状态码常量定义
 *
 * @version v1.0.0 @author lgz 2016-3-21 新建与整理
 */
public enum HttpStatus implements HttpConstants {
    
    
    /***********************************************************************/
    /***************************** TODO 0-99 连接相关 ************************/
    /***********************************************************************/
    
    /**
     * // 0 = 绝对成功
     */
    _0_SUCCESS_(0, "Success"),
    
    
    /**
     * // 70 = Malformed URL //非法的URL
     */
    _70_MALFORMED_URL_(70, "Malformed URL"),
    
    /**
     * // 71 Unkown Host //未知的主机地址
     */
    _71_UNKOWN_HOST_(70, "Unkown Host"),
    
    /**
     * // 72 = 远程参数为满足
     */
    _72_PARAM_NOT_SATISFIED_(72, "Param Not Satisfied"),
    
    /**
     * // 73 = Socket 超时
     */
    _73_SOCKET_TIMEOUT_(73, "Socket Timeout"),
    
    /**
     * // 80 SSL Exception //SSL 异常
     **/
    _80_SSL_EXCEPTION_(80, "SSL Exception"),
    
    /**
     * // 81 SSL Handshake Exception //SSL 握手异常
     */
    _81_SSL_HANDSHAKE_EXCEPTION_(81, "SSL Handshake Exception"),
    
    /**
     * // 90 Socket Exception //Socket 异常
     */
    _90_SOCKET_EXCEPTION_(90, "Socket Exception"),
    
    /**
     * // 91 Connect Exception //连接异常
     */
    _91_CONNECT_EXCEPTION_(91, "Connect Exception"),
    
    /**
     * // 98 IO Exception //未知IO异常
     */
    _98_IO_EXCEPTION_(98, "IO Exception"),
    
    /**
     * // 99 Exception //未知异常
     */
    _99_EXCEPTION_(99, "Exception"),
    
    /***********************************************************************/
    /***************************** TODO 1xx ********************************/
    /***********************************************************************/
    /**
     * // 100 Continue //客户端应当继续发送请求（HTTP 1.1新）
     */
    _100_CONTINUE_(100, "Continue"),
    
    /**
     * // 101 Switching Protocols //服务器将遵从客户的请求转换到另外一种协议（HTTP 1.1新）
     */
    _101_SWITCHING_PROTOCOLS_(101, "Switching Protocols"),
    
    /**
     * // 102 Processing //由WebDAV（RFC 2518）扩展的状态码，代表处理将被继续执行。
     */
    _102_PROCESSING_(102, "Processing"),
    
    
    /***********************************************************************/
    /***************************** TODO 2xx ********************************/
    /***********************************************************************/
    
    /**
     * // 200 OK //客户端请求成功
     */
    _200_OK_(200, "OK"),
    
    /**
     * // 201 Created //服务器已经创建了文档，Location头给出了它的URL。 一般应用于PUT请求时
     */
    _201_CREATED_(201, "Created"),
    
    /**
     * // 202 Accepted //服务器已接受请求，文档还未处理完，一般应用于PUT请求异步处理
     */
    _202_ACCEPTED_(202, "Accepted"),
    
    /**
     * // 203 Non-Authoritative Information 文档已经正常地返回，但一些应答头可能不正确，因为使用的是文档的拷贝，一般应用于PUT秒传。
     */
    _203_NON_AUTHORITATIVE_INFORMATION_(203, "Non-Authoritative Information"),
    
    /**
     * // 204 No Content //客户端请求成功，无内容，和200内容为空不同的是，200浏览器会跳转到空页面，而204是忽略，即不跳转
     */
    _204_NO_CONTENT_(204, "No Content"),
    
    /**
     * // 205 Reset Content //服务器成功处理了请求,和204不同的是205要求重置内容，如刷新或重置表单等
     */
    _205_RESET_CONTENT_(205, "Reset Content"),
    
    /**
     * // 206 Partial Content //客户端请求成功，响应部分内容，一般用于断点续传，客户端指定Range,服务端相应Range部分的内容
     */
    _206_PARTIAL_CONTENT_(206, "Partial Content"),
    
    /**
     * // 207 Multi-Status //由WebDAV(RFC 2518)扩展的状态码，代表之后的消息体将是一个XML消息，并且可能依照之前子请求数量的不同，包含一系列独立的响应代码。
     */
    _207_MULTI_STATUS_(207, "Multi-Status"),
    
    /***********************************************************************/
    /***************************** TODO 3xx ********************************/
    /***********************************************************************/
    
    /**
     * // 301 Moved Permanently //所请求的页面已经转移至新的url。
     */
    _300_MULTIPLE_CHOICES_(300, "Multiple Choices"),
    
    /**
     * // 301 Moved Permanently //所请求的页面已经转移至新的url。
     */
    _301_MOVED_PERMANENTLY_(301, "Multiple Choices"),
    
    /**
     * // 302 FOUND //客户端重定向
     */
    _302_FOUND_(302, "Found Choices"),
    
    /**
     * // 303 See Other //所请求的页面可在别的url下被找到。
     */
    _303_SEE_OTHER_(302, "Found Choices"),
    
    /**
     * // 304 Not Modified //内容未修改
     */
    _304_NOT_MODIFIED_(304, "Not Modified"),
    
    /**
     * // 305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取。
     */
    _305_USE_PROXY_(305, "Use Proxy"),
    
    /**
     * // 306 Switch Proxy在最新版的规范中，306状态码已经不再被使用。
     */
    _306_SWITCH_PROXY_(306, "Switch Proxy"),
    
    /**
     * // 307 Temporary Redirect 和302（Found）相同，但只作GET重定向。
     */
    _307_TEMPORARY_REDIRECT_(307, "Temporary redirect"),
    
    /***********************************************************************/
    /***************************** TODO 4xx ********************************/
    /***********************************************************************/
    
    /**
     * // 400 Bad Request //客户端请求有语法错误，不能被服务器所理解
     */
    _400_BAD_REQUEST_(400, "Bade Request"),
    /**
     * // 401 Unauthorized //请求未经授权，这个状态代码必须和WWW-Authenticate报头域一起使用
     */
    _401_UNAUTHORIZED_(401, "Unauthorized"),
    
    /**
     * // 402 Payment Required 该状态码是为了将来可能的需求而预留的。
     */
    _402_PAYMENT_REQUIRED_(402, "Payment Required"),
    
    /**
     * // 403 Forbidden //服务器收到请求，但是拒绝提供服务
     */
    _403_FORBIDDEN_(403, "Forbidden"),
    
    /**
     * // 404 Not Found //请求资源不存在，eg：输入了错误的URL
     */
    _404_NOT_FOUND_(404, "Not Found"),
    
    /**
     * // 405 Method Not Allow //不支持的方法
     */
    _405_METHOD_NOT_ALLOWD_(405, "Method Not Allowed"),
    
    /**
     * // 406 Not Acceptable //指定的资源已经找到，但它的MIME类型和客户在Accpet头中所指定的不兼容。
     */
    _406_NOT_ACCEPTABLE_(406, "Not Acceptable"),
    
    /**
     * // 407 Proxy Authentication Required 类似于401，表示客户必须先经过代理服务器的授权。
     */
    _407_PROXY_AUTHENTICATION_REQUIRED_(407, "Proxy Authentication Required"),
    
    /**
     * // 408 Request Timeout 在服务器许可的等待时间内，客户一直没有发出任何请求。客户可以在以后重复同一请求。
     */
    _408_REQUEST_TIMEOUT_(408, "Request Timeout"),
    
    /**
     * // 409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突，因此请求不能成功。
     */
    _409_CONFLICT_(409, "Conflict"),
    
    /**
     * // 410 Gone 所请求的文档已经不再可用，而且服务器不知道应该重定向到哪一个地址。它和404的不同在于，返回407表示文档永久地离开了指定的位置，而404表示由于未知的原因文档不可用。
     */
    _410_GONE_(410, "Gone"),
    
    /**
     * // 411 Length Required //内容长度必须提供
     */
    _411_LENGTH_REQUIRED_(411, "Length required"),
    
    /**
     * // 412 Precondition Failed 请求头中指定的一些前提条件失败。
     */
    _412_PRECONDITION_FAILED_(412, "Precondition Failed"),
    
    /**
     * // 413 Request Entity Too Large //请求的实体太大
     */
    _413_REQUEST_ENTITY_TOO_LARGE_(413, "Request Entity Too Large"),
    
    /**
     * // 414 Request Url Too Large //请求URL太大
     */
    _414_REQUEST_URL_TOO_LARGE_(414, "Request Url Too Large"),
    
    /**
     * // 415 Unsupported Media Type 对于当前请求的方法和所请求的资源，请求中提交的实体并不是服务器中所支持的格式，因此请求被拒绝。
     */
    _415_UNSUPPORTED_MEDIA_TYPE_(415, "Unsupported Media Type"),
    
    /**
     * // 416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头
     */
    _416_REQUESTED_RANGE_NOT_SATISFIABLE_(416, "Requested Range Not Satisfiable"),
    /**
     * // 417 Expectation Failed在请求头 Expect 中指定的预期内容无法被服务器满足。
     */
    _417_EXPECTATION_FAILED_(417, "Expectation Failed在请求头"),
    
    /**
     * // 421 There are too many connections from your internet address
     */
    _421_TOO_MANY_CONNECTIONS_FROM_IP_(421, "There are too many connections from your internet address"),
    
    /**
     * // 422 Unprocessable Entity 请求格式正确，但是由于含有语义错误，无法响应。（RFC 4918 WebDAV）
     */
    _422_UNPROCESSABLE_ENTITY_(422, "Unprocessable Entity"),
    
    /**
     * // 423 Locked 当前资源被锁定。（RFC 4918 WebDAV）
     */
    _423_LOCKED_(423, "Locked"),
    
    /**
     * // 424 Failed Dependency 由于之前的某个请求发生的错误，导致当前请求失败，例如 PROPPATCH。（RFC 4918 WebDAV）
     */
    _424_FAILED_DEPENDENCY_(424, "Failed Dependency"),
    
    /**
     * // 425 Unordered Collection 在WebDav Advanced Collections 草案中定义，但是未出现在《WebDAV 顺序集协议》（RFC 3658）中。
     */
    _425_UNORDERED_COLLECTION_(425, "Unordered Collection"),
    
    /**
     * // 426 Upgrade Required 客户端应当切换到TLS/1.0。（RFC 2817）
     */
    _426_UPGRADE_REQUIRED_(424, "Upgrade Required"),
    
    /**
     * // 444 Interrupt //直接中断,NGINX使用到
     */
    _444_INTERRUPT_(444, "Interrupt"),
    
    /**
     * // 449 Retry With //重试,微软使用到
     */
    _449_RETRY_WITH_(449, "Retry With"),
    
    
    /***********************************************************************/
    /***************************** TODO 5xx ********************************/
    /***********************************************************************/
    
    /**
     * // 500 Internal Server Error //服务器发生不可预期的错误
     */
    _500_INTERNAL_SERVER_ERROR_(500, "Internal Server Error"),
    
    /**
     * // 501 Not Implemented 服务器不支持实现请求所需要的功能。例如，客户发出了一个服务器不支持的PUT请求。
     */
    _501_NOT_IMPLEMENTED_(501, "Not Implemented"),
    /**
     * // 502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时，从上游服务器接收到无效的响应。
     */
    _502_BAD_GATEWAY_(502, "502 Bad Gateway"),
    
    /**
     * // 503 Server Unavailable //服务器当前不能处理客户端的请求，一段时间后可能恢复正常
     */
    _503_SERVER_UNAVAILABLE_(503, "Server Unavailable"),
    
    /**
     * // 504 Gateway Timeout 由作为代理或网关的服务器使用，表示不能及时地从远程服务器获得应答
     */
    _504_GATEWAY_TIMEOUT_(504, "Gateway Timeout"),
    
    /**
     * // 505 HTTP Version Not Supported //服务器不支持版本
     */
    _505_VERSION_NOT_SUPPORTED_(505, "Version Not Supported"),
    
    /**
     * // 506 Variant Also Negotiates 由《透明内容协商协议》（RFC 2295）扩展，代表服务器存在内部配置错误：被请求的协商变元资源被配置为在透明内容协商中使用自己，因此在一个协商处理中不是一个合适的重点。
     */
    _506_VARIANT_ALSO_NEGOTIATES_(506, "Variant Also Negotiates"),
    
    /**
     * // 507 Insufficient Storage 服务器无法存储完成请求所必须的内容。这个状况被认为是临时的。WebDAV (RFC 4918)
     */
    _507_INSUFFICIENT_STORAGE_(507, "Insufficient Storage"),
    
    /**
     * // 508 Loop Detected 服务器发现请求中出现一个无穷循环
     */
    _508_LOOP_DETECTED_(508, "Loop Detected"),
    
    /**
     * // 509 Bandwidth Limit Exceeded 服务器达到带宽限制。这不是一个官方的状态码，但是仍被广泛使用。
     */
    _509_BANDWIDTH_LIMIT_EXCEEDED_(509, "Bandwidth Limit Exceeded"),
    
    /**
     * // 510 Not Extended 服务器不支持的扩展。（RFC 2774）
     */
    _510_NOT_EXTENDED_(510, " Not Extended"),
    
    /**
     * // 600 Unparseable Response Headers //无法解析响应头
     */
    _600_UNPARSEABLE_RESPONSE_HEADERS_(600, "Unparseable Response Headers"),
    
    /**
     * // 999 App Service Erro 应用业务错误 // 这个不是官方的状态码，使用在程序中 通用错误码
     */
    _999_ERROR_(999, " App Service Error"),
    ;
    private final int code;
    private final String desc;
    
    HttpStatus(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    
    public int getCode() {
        return code;
    }
    
    public String getDesc() {
        return desc;
    }
    
    private static final HashMap<Integer, HttpStatus> STATUS_MAP = new HashMap<Integer, HttpStatus>();
    
    static {
        for (HttpStatus item : HttpStatus.values()) {
            STATUS_MAP.put(item.code, item);
        }
    }
    
    /**
     * 获取http 状态码实例
     *
     * @param code 状态码
     * @return 实例
     */
    public static final HttpStatus of(int code) {
        return STATUS_MAP.get(code);
    }
    
    /**
     * 获取HTTP 状态码对应的 描述信息
     *
     * @param code 状态码
     * @return 描述信息
     */
    public static final String msg(int code) {
        HttpStatus item = of(code);
        return item == null ? "" + code : item.desc;
    }
    
    /**
     * 是否支持 该状态码
     *
     * @param code 状态码
     * @return true|false
     */
    public static final boolean isSupport(int code) {
        return STATUS_MAP.containsKey(code);
    }
    
    
}
